/********************************************************/
/*	Author:		gong_libin			*/
/*	Date:		2015_02_07			*/
/*	File:		GtDcpDns.h			*/
/********************************************************/

#ifndef	_GTDCPDNS_H
#define	_GTDCRDNS_H

#include "GtPro.h"
#include "GtMsg.h"
#include "GtRaw.h"
#include "GtUtl.h"
#include "GtTime.h"
#include "GtDgram.h"
#include "GtThread.h"
#include "GtDcpDef.h"

#include <ctype.h>
#include <getopt.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netpacket/packet.h>

// RFC1034-<<DOMAIN NAMES - CONCEPTS AND FACILITIES>>
// RFC1035-<<DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION>>

//   0     1--4    05   06   07   08    9-11    12-15
// +----+--------+----+----+----+----+--------+-------+
// | QR | opcode | AA | TC | RD | RA | <zero> | rcode |
// +----+--------+----+----+----+----+--------+-------+

// 0                   1                   2                   3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |              ID               |             flags             |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |   Question:   type of query   |  Answer:  RR answer to query  |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Authority: RR for name server | Additional:  RR(s) other info |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |                           (Queries)                           |
// |                          Domain names                         |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |             Type              |             Class             |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |
// |             ...
// |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

#define	GT_DN_QUES			8
#define	GT_DN_PORT			53

#define	GT_DNS_FGQR			0x8000
#define	GT_DNS_FGOP			0x7800
#define	GT_DNS_FGAA			0x0400
#define	GT_DNS_FGTC			0x0200
#define	GT_DNS_FGRD			0x0100
#define	GT_DNS_FGRA			0x0080
#define	GT_DNS_FGRC			0x000F

#define GT_DR_ETHLEN			14

typedef struct tagGtDnDns
{
	USHORT m_usID;
	struct {
		UCHAR m_ucQR:1;
		UCHAR m_ucOP:4;
		UCHAR m_ucAA:1;
		UCHAR m_ucTC:1;
		UCHAR m_ucRD:1;
		UCHAR m_ucRA:1;
		UCHAR m_ucZR:3;
		UCHAR m_ucRC:4;
	}m_stFlag;
	USHORT m_usQuNum;		// Query Number
	USHORT m_usAnNum;		// Answer Number
	USHORT m_usAuNum;		// Authority Num
	USHORT m_usAdNum;		// Additional Num
	struct {
		char m_szHost[GT_KBYTES2];
		USHORT m_usType;
		USHORT m_usClass;
	}m_stQuery[GT_DN_QUES];
	UCHAR m_szSport[16];
	UCHAR m_szDport[16];
	UCHAR m_szSaddr[16];
	UCHAR m_szDaddr[16];
}GTDNDNS_S;

void GtDnQuit(int iSignal);
void* GtDnCore(void* pNet);
int GtDnInet(char* pszBind, GtNet::CGtNet* pCNet);
int GtDnUnix(char* pszBind, GtNet::CGtNet* pCNet);
int GtDnDnsParse(GTDNDNS_S* pstDns, UCHAR* puszDns, int iDns);
int GtDnQueue(GTDNDNS_S* pstDns);

	
#endif /* _GTDCPDNS_H */
